package emu.decvices.ppu;

import emu.decvices.bus.BusDevice;

/**
 * 调色板
 */
public class Palette extends BusDevice {
    private int data[] = new int[0x20];//32byte

    @Override
    public int fromDeviceRead(int address) {
        if(address>=0x3F00&&address<0x4000){
            address&=0x1F;
            if(address==0x0010||address==0x0014||address==0x0018||address==0x001C){
                address &= 0x000F;
            }
            return data[address];
        }
        return -1;
    }

    @Override
    public boolean toDeviceWrite(int address, int d) {
        if(address>=0x3F00&&address<0x4000) {
            address&=0x1F;
            /*
                在NES的PPU（图像处理单元）中，调色板被分为两部分：背景调色板和精灵调色板。每个调色板都有4个子调色板，每个子调色板包含4种颜色。这些颜色中的第一种（索引0）总是透明的。
                背景调色板的地址范围是0x3F00到0x3F0F，精灵调色板的地址范围是0x3F10到0x3F1F。然而，由于硬件的镜像，背景调色板和精灵调色板的第一个颜色（即地址0x3F00和0x3F10）实际上是相同的。
                所以，虽然0x0010看起来像是精灵调色板的第一个颜色，但由于这个镜像，它实际上和背景调色板的第一个颜色是同一个颜色。真正的精灵调色板的颜色从索引1开始，即地址0x3F11。
             */
            if(address==0x0010||address==0x0014||address==0x0018||address==0x001C){
                address &= 0x000F;
            }
            data[address] = d&0x00FF;
            return true;
        }
        return false;
    }
}
